package cn.edu.cauc.isecca.fc;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Base64;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.border.LineBorder;
import java.awt.Color;

public class FlagCounter extends JFrame implements ActionListener {

	private static final long serialVersionUID = 4965545448250479894L;
	private JPanel contentPane;
	private JTextField textFieldFlag;
	private JButton btnSubmit;
	private JButton btnReset;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(()->{
			try {
				FlagCounter frame = new FlagCounter();
				frame.setVisible(true);
			} catch (Exception e) {
				e.printStackTrace();
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public FlagCounter() {
		setTitle("FlagCounter");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setBounds(100, 100, 400, 150);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		JPanel panelCenter = new JPanel();
		contentPane.add(panelCenter, BorderLayout.CENTER);
		
		JLabel lblFlag = new JLabel("flag{");
		panelCenter.add(lblFlag);
		
		textFieldFlag = new JTextField();
		textFieldFlag.setColumns(25);
		textFieldFlag.setBorder(new LineBorder(Color.BLACK));
		panelCenter.add(textFieldFlag);
		
		JLabel label_1 = new JLabel("}");
		panelCenter.add(label_1);
		
		JPanel panelSouth = new JPanel();
		contentPane.add(panelSouth, BorderLayout.SOUTH);
		
		btnSubmit = new JButton("提交");
		btnSubmit.addActionListener(this);
		panelSouth.add(btnSubmit);
		
		btnReset = new JButton("重置");
		btnReset.addActionListener(this);
		panelSouth.add(btnReset);
		
		JPanel panelNorth = new JPanel();
		contentPane.add(panelNorth, BorderLayout.NORTH);
		
		JLabel label = new JLabel("请输入挑战");
		panelNorth.add(label);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == btnReset) {
			textFieldFlag.setText("");
			textFieldFlag.setBorder(new LineBorder(Color.BLACK));
			return;
		} else if(e.getSource() == btnSubmit) {
			FlagCounter.FlagChecker fc = new FlagCounter.FlagChecker();
			if (fc.check(textFieldFlag.getText())) {
				textFieldFlag.setBorder(new LineBorder(Color.GREEN));
			} else {
				textFieldFlag.setBorder(new LineBorder(Color.RED));
			}
			return;
		}
	}
	
	class FlagChecker {
		private int s[][]= {
		        {0x63 ,0x7C ,0x77 ,0x7B ,0xF2 ,0x6B ,0x6F ,0xC5 ,0x30 ,0x01 ,0x67 ,0x2B ,0xFE ,0xD7 ,0xAB ,0x76},
		        {0xCA ,0x82 ,0xC9 ,0x7D ,0xFA ,0x59 ,0x47 ,0xF0 ,0xAD ,0xD4 ,0xA2 ,0xAF ,0x9C ,0xA4 ,0x72 ,0xC0},
		        {0xB7 ,0xFD ,0x93 ,0x26 ,0x36 ,0x3F ,0xF7 ,0xCC ,0x34 ,0xA5 ,0xE5 ,0xF1 ,0x71 ,0xD8 ,0x31 ,0x15},
		        {0x04 ,0xC7 ,0x23 ,0xC3 ,0x18 ,0x96 ,0x05 ,0x9A ,0x07 ,0x12 ,0x80 ,0xE2 ,0xEB ,0x27 ,0xB2 ,0x75},
		        {0x09 ,0x83 ,0x2C ,0x1A ,0x1B ,0x6E ,0x5A ,0xA0 ,0x52 ,0x3B ,0xD6 ,0xB3 ,0x29 ,0xE3 ,0x2F ,0x84},
		        {0x53 ,0xD1 ,0x00 ,0xED ,0x20 ,0xFC ,0xB1 ,0x5B ,0x6A ,0xCB ,0xBE ,0x39 ,0x4A ,0x4C ,0x58 ,0xCF},
		        {0xD0 ,0xEF ,0xAA ,0xFB ,0x43 ,0x4D ,0x33 ,0x85 ,0x45 ,0xF9 ,0x02 ,0x7F ,0x50 ,0x3C ,0x9F ,0xA8},
		        {0x51 ,0xA3 ,0x40 ,0x8F ,0x92 ,0x9D ,0x38 ,0xF5 ,0xBC ,0xB6 ,0xDA ,0x21 ,0x10 ,0xFF ,0xF3 ,0xD2},
		        {0xCD ,0x0C ,0x13 ,0xEC ,0x5F ,0x97 ,0x44 ,0x17 ,0xC4 ,0xA7 ,0x7E ,0x3D ,0x64 ,0x5D ,0x19 ,0x73},
		        {0x60 ,0x81 ,0x4F ,0xDC ,0x22 ,0x2A ,0x90 ,0x88 ,0x46 ,0xEE ,0xB8 ,0x14 ,0xDE ,0x5E ,0x0B ,0xDB},
		        {0xE0 ,0x32 ,0x3A ,0x0A ,0x49 ,0x06 ,0x24 ,0x5C ,0xC2 ,0xD3 ,0xAC ,0x62 ,0x91 ,0x95 ,0xE4 ,0x79},
		        {0xE7 ,0xC8 ,0x37 ,0x6D ,0x8D ,0xD5 ,0x4E ,0xA9 ,0x6C ,0x56 ,0xF4 ,0xEA ,0x65 ,0x7A ,0xAE ,0x08},
		        {0xBA ,0x78 ,0x25 ,0x2E ,0x1C ,0xA6 ,0xB4 ,0xC6 ,0xE8 ,0xDD ,0x74 ,0x1F ,0x4B ,0xBD ,0x8B ,0x8A},
		        {0x70 ,0x3E ,0xB5 ,0x66 ,0x48 ,0x03 ,0xF6 ,0x0E ,0x61 ,0x35 ,0x57 ,0xB9 ,0x86 ,0xC1 ,0x1D ,0x9E},
		        {0xE1 ,0xF8 ,0x98 ,0x11 ,0x69 ,0xD9 ,0x8E ,0x94 ,0x9B ,0x1E ,0x87 ,0xE9 ,0xCE ,0x55 ,0x28 ,0xDF},
		        {0x8C ,0xA1 ,0x89 ,0x0D ,0xBF ,0xE6 ,0x42 ,0x68 ,0x41 ,0x99 ,0x2D ,0x0F ,0xB0 ,0x54 ,0xBB ,0x16}
		};
//		flag{g1wE_me_@_fREe_t1CkeT}
		/*
		0x67 0 10
		0x31 2 14
		0x77 0 2
		0x45 6 8
		0x5f 8 4
		0x6d 11 3
		0x65 11 12
		0x5f 8 4
		0x40 7 2
		0x5f 8 4
		0x66 13 3
		0x52 4 8
		0x45 6 8
		0x65 11 12
		0x5f 8 4
		0x74 12 10
		0x31 2 14
		0x43 6 4
		0x6b 0 5
		0x65 11 12
		0x54 15 13
		*/
		public boolean check(String flag) {
			if(flag.length() != 21) {
				return false;
			}
			String encodeRow = "MCwyLDAsNiw4LDExLDExLDgsNyw4LDEzLDQsNiwxMSw4LDEyLDIsNiwwLDExLDE1";
			String encodeColumn = "MTAsMTQsMiw4LDQsMywxMiw0LDIsNCwzLDgsOCwxMiw0LDEwLDE0LDQsNSwxMiwxMw==";
			String indexRowString = new String(Base64.getDecoder().decode(encodeRow));
			String indexColumnString = new String(Base64.getDecoder().decode(encodeColumn));
			String[] indexRowArray = indexRowString.split(String.valueOf((char)s[4][2]));
			String[] indexColumnArray = indexColumnString.split(String.valueOf((char)s[4][2]));
			if ((indexRowArray.length != indexColumnArray.length) || indexRowArray.length == 0) {
				return false;
			}
			for(int i = 0; i < indexRowArray.length; ++i) {
				if (flag.charAt(i) != s[Integer.valueOf(indexRowArray[i])][Integer.valueOf(indexColumnArray[i])]) {
					return false;
				}
			}
			return true;
		}
	}

}
